package com.log4jviewer.domain;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import junit.framework.Assert;

import org.apache.log4j.Level;
import org.apache.log4j.spi.LocationInfo;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.ThrowableInformation;
import org.junit.Before;
import org.junit.Test;

public class SocketLogEventTest {

    private LoggingEvent mockLog;
    private LocationInfo mockLocationInfo;
    private SocketLogEvent socketLogEvent;

    @Before
    public void init() {
        mockLog = mock(LoggingEvent.class);
        mockLocationInfo = mock(LocationInfo.class);
        when(mockLog.getLocationInformation()).thenReturn(mockLocationInfo);
        socketLogEvent = new SocketLogEvent(mockLog);
    }

    @Test
    public void logInfoTest() {
        when(mockLog.getLoggerName()).thenReturn("CategoryName");
        Assert.assertEquals("CategoryName", socketLogEvent.getCategoryName());

        when(mockLocationInfo.getClassName()).thenReturn("ClassName");
        Assert.assertEquals("ClassName", socketLogEvent.getClassName());

        when(mockLocationInfo.getFileName()).thenReturn("FileName");
        Assert.assertEquals("FileName", socketLogEvent.getFileName());

        when(mockLocationInfo.getLineNumber()).thenReturn("7");
        Assert.assertEquals("7", socketLogEvent.getLineNumber());

        when(mockLog.getRenderedMessage()).thenReturn("Message");
        Assert.assertEquals("Message", socketLogEvent.getMessage());

        when(mockLocationInfo.getMethodName()).thenReturn("MethodName");
        Assert.assertEquals("MethodName", socketLogEvent.getMethodName());

        when(mockLog.getNDC()).thenReturn("Ndc");
        Assert.assertEquals("Ndc", socketLogEvent.getNdc());

        when(mockLog.getLevel()).thenReturn(Level.DEBUG);
        Assert.assertEquals("DEBUG", socketLogEvent.getLevel());

        when(mockLog.getThreadName()).thenReturn("ThreadName");
        Assert.assertEquals("ThreadName", socketLogEvent.getThreadName());

        when(mockLog.getThrowableInformation()).thenReturn(new ThrowableInformation(new Throwable("Exception")));
        Assert.assertEquals("Exception", socketLogEvent.getThrowableInfo());
    }

    @Test
    public void emptyLogInfoTest() {
        Assert.assertEquals("", socketLogEvent.getCategoryName());
        Assert.assertEquals("", socketLogEvent.getClassName());
        Assert.assertEquals("", socketLogEvent.getDate());
        Assert.assertEquals("", socketLogEvent.getFileName());
        Assert.assertEquals("", socketLogEvent.getLineNumber());
        Assert.assertEquals("", socketLogEvent.getMdc());
        Assert.assertEquals("", socketLogEvent.getMessage());
        Assert.assertEquals("", socketLogEvent.getMethodName());
        Assert.assertEquals("", socketLogEvent.getNdc());
        Assert.assertEquals("", socketLogEvent.getLevel());
        Assert.assertEquals("", socketLogEvent.getThreadName());
        Assert.assertEquals("", socketLogEvent.getThrowableInfo());
    }
}
